package com.xcjh.module_ad.manager

import android.app.Activity
import android.content.Context
import android.util.Log
import com.google.android.gms.ads.AdError
import com.google.android.gms.ads.AdRequest
import com.google.android.gms.ads.FullScreenContentCallback
import com.google.android.gms.ads.LoadAdError
import com.google.android.gms.ads.appopen.AppOpenAd
import com.xcjh.base_lib.Constants
import java.util.*
//private const val AD_UNIT_ID = "ca-app-pub-3940256099942544/3419835294"
//加载和显示开屏广告
class AppOpenAdManager {
    private val LOG_TAG = "AppOpenAdManager"
    private var appOpenAd: AppOpenAd? = null
    private var isLoadingAd = false
    var isShowingAd = false

    /** 跟踪应用打开广告的加载时间，以确保您不会展示过期的广告。 */
    private var loadTime: Long = 0

    /**
     * 加载广告。
     *
     */
    fun loadAd(context: Context) {
        // 如果有未使用的广告或已经加载的广告，请不要加载广告。
        if (isLoadingAd || isAdAvailable()) {
            return
        }

        isLoadingAd = true
        val request = AdRequest.Builder().build()
        AppOpenAd.load(
            context,
            // AD_UNIT_ID,
            Constants.LaunchAdUnitId,
            request,
            AppOpenAd.APP_OPEN_AD_ORIENTATION_PORTRAIT,
            object : AppOpenAd.AppOpenAdLoadCallback() {
                /**
                 * 加载开屏广告时调用
                 */
                override fun onAdLoaded(ad: AppOpenAd) {
                    appOpenAd = ad
                    isLoadingAd = false
                    loadTime = Date().time
                    Log.d(LOG_TAG, "加载开屏广告成功.")
                }
                /**
                 * 当开屏广告加载失败时调用
                 */
                override fun onAdFailedToLoad(loadAdError: LoadAdError) {
                    isLoadingAd = false
                    Log.d(LOG_TAG, "开屏广告加载失败: " + loadAdError.message)
                }
            }
        )
    }

    /** 检查广告是否在 n 小时前加载. */
    private fun wasLoadTimeLessThanNHoursAgo(numHours: Long): Boolean {
        val dateDifference: Long = Date().time - loadTime
        val numMilliSecondsPerHour: Long = 3600000
        return dateDifference < numMilliSecondsPerHour * numHours
    }

    /** 检查广告是否存在并且可以显示. */
    private fun isAdAvailable(): Boolean {
        // 应用公开测试版中的广告引用将在四小时后超时，但此时间限制可能会在未来的测试版中发生变化。
        // 有关详细信息，请参阅: https://support.google.com/admob/answer/9341964?hl=en
        return appOpenAd != null && wasLoadTimeLessThanNHoursAgo(4)
    }

    /**
     * 展示广告（如果尚未展示）
     *
     * @param activity 显示应用打开广告的活动
     * @param action 应用打开广告完成时要通知的听众
     */
    fun showAdIfAvailable(activity: Activity,  action: () -> Unit = {}) {
        // 如果开屏广告已经在展示，请不要再次展示该广告.
        if (isShowingAd) {
            Log.d(LOG_TAG, "开屏广告已经在展示.")
            return
        }
        // 如果应用打开广告尚不可用，调用回调然后加载广告.
        if (!isAdAvailable()) {
            Log.d(LOG_TAG, "广告尚不可用.")
            action.invoke()
            loadAd(activity)
            return
        }

        Log.d(LOG_TAG, "Will show ad.")
        // appOpenAd!!.fullScreenContentCallback?.onAdDismissedFullScreenContent()
        appOpenAd!!.fullScreenContentCallback = object : FullScreenContentCallback() {
            /** 全屏内容消失时调用. */
            override fun onAdDismissedFullScreenContent() {
                // Set the reference to null so isAdAvailable() returns false.
                appOpenAd = null
                isShowingAd = false
                Log.d(LOG_TAG, "全屏内容消失.")

                action.invoke()
                loadAd(activity)
            }

            /** 全屏内容无法显示时调用. */
            override fun onAdFailedToShowFullScreenContent(adError: AdError) {
                appOpenAd = null
                isShowingAd = false
                Log.d(LOG_TAG, "全屏内容无法显示: " + adError.message)

                action.invoke()
                loadAd(activity)
            }

            /** 显示全屏内容时调用*/
            override fun onAdShowedFullScreenContent() {
                Log.d(LOG_TAG, "显示全屏内容.")
            }
        }
        isShowingAd = true
        appOpenAd!!.show(activity)
    }
    /**
     * 应用打开广告完成（即关闭或无法显示）时调用的回调的接口定义
     */
    interface OnShowAdCompleteListener {
        fun onShowAdComplete()
    }
}